package cn.mandifal.cart.controller;

import cn.mandifal.cart.service.CartService;
import cn.mandifal.pojo.Cart;
import cn.mandifal.utils.CookieUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import entity.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 购物车控制层
 * @author shun
 */
@RestController
@RequestMapping("/cartController")
public class CartController {
    @Reference
    private CartService cartService;
    /**
     * 注入 http 请求对象,以便操作请求中的参数
     */
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;

    /**
     * 若未登录，从 cookie 中得到购物车列表，登陆，从 redis 中取
     * @return 返回得到的购物车列表
     */
    @RequestMapping("/findCartList")
    public List<Cart> findCartList(){
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        System.out.println(username);
        //如果 cookie 中有中文必须指定编码为 utf-8,cartList为想要得到的 cookie 的名字
        String cartListString = CookieUtil.getCookieValue(request, "cartList", "UTF-8");
        //如果cookie 中没有 cartList
        if(cartListString==null || cartListString.equals("")){
            cartListString="[]";
        }
        //利用 json 转换成 List 类型
        List<Cart> cartListFromCookie = JSON.parseArray(cartListString, Cart.class);
        //未登录
        if ("anonymousUser".equals(username)){
            System.out.println("从 cookie 提取成功");
            return cartListFromCookie;
        }else {//已登录
            List<Cart> cartListFromRedis = cartService.findCartListFromRedis(username);
            //如果 cookie 中的购物车列表长度大于 0,则走合并逻辑
            if (cartListFromCookie.size()>0){
                //合并 cookie 和 redis 中的购物车
                List<Cart> cartList = cartService.mergeCartList(cartListFromCookie, cartListFromRedis);
                System.out.println("购物车合并并保存到 redis 成功");
                //清空 cookie 中的购物车列表数据
                CookieUtil.deleteCookie(request,response,"cartList");
                //将合并后的购物车列表存入 redis
                cartService.saveCartListToRedis(username,cartList);
                return cartList;
            }else {
                System.out.println("从 redis 提取成功");
            }
            return cartListFromRedis;
        }
    }

    /**
     * 添加商品到购物车列表，如果 cookie 中存在购物车则提取
     * @param itemId 商品 sku id
     * @param num 商品数量
     * @return
     */
    @RequestMapping("/addGoodsToCartList")
    @CrossOrigin(origins = "http://localhost:8085")
    public Result addGoodsToCartList(Long itemId,Integer num){
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        try {
            //得到购物车列表对象
            List<Cart> cartList = findCartList();
            //把购物车列表对象添加到原购物车列表对象中
            cartList = cartService.addGoodsToCartList(cartList, itemId, num);
            //未登录放入 cookie
            if ("anonymousUser".equals(username)){
                //将新的购物车列表对象放入 cookie 中
                //cookie 中只能存 string 类型，所以通过 json 转
                String cartListString = JSON.toJSONString(cartList);
                //此 cookie 存在的最长时间为 3600*24 秒
                CookieUtil.setCookie(request,response,"cartList",cartListString,3600*24,"UTF-8");
                System.out.println("存入 cookie 成功");
            }else {//登陆放入 redis
                cartService.saveCartListToRedis(username,cartList);
                System.out.println("存入 redis 成功");
            }
            return Result.success("保存购物车成功");
        } catch (Exception e) {
            e.printStackTrace();
            return Result.success("保存购物车失败");
        }
    }
}
